package com.cencat.common.utils;

import cn.hutool.core.util.StrUtil;
import com.cencat.common.constant.CommonConstants;

import java.util.Collection;
import java.util.Map;
import java.util.regex.Pattern;

/**
 * 字符串工具类
 * 扩展Hutool的字符串工具功能
 */
public class StringUtils extends StrUtil {
    
    /**
     * 空字符串
     */
    public static final String EMPTY = "";
    
    /**
     * 下划线字符
     */
    private static final char SEPARATOR = '_';
    
    /**
     * 判断对象是否为空
     * @param obj 对象
     * @return 是否为空
     */
    public static boolean isEmpty(Object obj) {
        if (obj == null) {
            return true;
        }
        
        if (obj instanceof String) {
            return isEmpty((String) obj);
        }
        
        if (obj instanceof Collection) {
            return ((Collection<?>) obj).isEmpty();
        }
        
        if (obj instanceof Map) {
            return ((Map<?, ?>) obj).isEmpty();
        }
        
        if (obj instanceof Object[]) {
            return ((Object[]) obj).length == 0;
        }
        
        return false;
    }
    
    /**
     * 判断对象是否非空
     * @param obj 对象
     * @return 是否非空
     */
    public static boolean isNotEmpty(Object obj) {
        return !isEmpty(obj);
    }
    
    /**
     * 判断字符串是否为空白
     * @param str 字符串
     * @return 是否为空白
     */
    public static boolean isBlank(CharSequence str) {
        return StrUtil.isBlank(str);
    }
    
    /**
     * 判断字符串是否非空白
     * @param str 字符串
     * @return 是否非空白
     */
    public static boolean isNotBlank(CharSequence str) {
        return StrUtil.isNotBlank(str);
    }
    
    /**
     * 验证手机号格式
     * @param mobile 手机号
     * @return 是否有效
     */
    public static boolean isMobile(String mobile) {
        if (isBlank(mobile)) {
            return false;
        }
        return Pattern.matches(CommonConstants.REGEX_MOBILE, mobile);
    }
    
    /**
     * 验证邮箱格式
     * @param email 邮箱
     * @return 是否有效
     */
    public static boolean isEmail(String email) {
        if (isBlank(email)) {
            return false;
        }
        return Pattern.matches(CommonConstants.REGEX_EMAIL, email);
    }
    
    /**
     * 验证用户名格式
     * @param username 用户名
     * @return 是否有效
     */
    public static boolean isUsername(String username) {
        if (isBlank(username)) {
            return false;
        }
        return Pattern.matches(CommonConstants.REGEX_USERNAME, username);
    }
    
    /**
     * 验证密码格式
     * @param password 密码
     * @return 是否有效
     */
    public static boolean isPassword(String password) {
        if (isBlank(password)) {
            return false;
        }
        return Pattern.matches(CommonConstants.REGEX_PASSWORD, password);
    }
    
    /**
     * 驼峰转下划线命名
     * @param str 驼峰命名字符串
     * @return 下划线命名字符串
     */
    public static String toUnderScoreCase(String str) {
        if (isBlank(str)) {
            return str;
        }
        
        StringBuilder sb = new StringBuilder();
        boolean first = true;
        for (char c : str.toCharArray()) {
            if (Character.isUpperCase(c)) {
                if (!first) {
                    sb.append(SEPARATOR);
                }
                sb.append(Character.toLowerCase(c));
            } else {
                sb.append(c);
            }
            first = false;
        }
        return sb.toString();
    }
    
    /**
     * 下划线转驼峰命名
     * @param str 下划线命名字符串
     * @return 驼峰命名字符串
     */
    public static String toCamelCase(String str) {
        if (isBlank(str)) {
            return str;
        }
        
        str = str.toLowerCase();
        StringBuilder sb = new StringBuilder();
        boolean upper = false;
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            if (c == SEPARATOR) {
                upper = true;
            } else {
                if (upper) {
                    sb.append(Character.toUpperCase(c));
                    upper = false;
                } else {
                    sb.append(c);
                }
            }
        }
        return sb.toString();
    }
    
    /**
     * 首字母大写
     * @param str 字符串
     * @return 首字母大写字符串
     */
    public static String capitalize(String str) {
        if (isBlank(str)) {
            return str;
        }
        return str.substring(0, 1).toUpperCase() + str.substring(1);
    }
    
    /**
     * 首字母小写
     * @param str 字符串
     * @return 首字母小写字符串
     */
    public static String uncapitalize(String str) {
        if (isBlank(str)) {
            return str;
        }
        return str.substring(0, 1).toLowerCase() + str.substring(1);
    }
    
    /**
     * 隐藏手机号中间4位
     * @param mobile 手机号
     * @return 隐藏后的手机号
     */
    public static String hideMobile(String mobile) {
        if (isBlank(mobile) || mobile.length() != 11) {
            return mobile;
        }
        return mobile.substring(0, 3) + "****" + mobile.substring(7);
    }
    
    /**
     * 隐藏邮箱
     * @param email 邮箱
     * @return 隐藏后的邮箱
     */
    public static String hideEmail(String email) {
        if (isBlank(email) || !email.contains("@")) {
            return email;
        }
        
        int atIndex = email.indexOf("@");
        String prefix = email.substring(0, atIndex);
        String suffix = email.substring(atIndex);
        
        if (prefix.length() <= 2) {
            return "*" + suffix;
        } else {
            return prefix.substring(0, 2) + "***" + suffix;
        }
    }
    
    /**
     * 截取字符串，超过长度显示省略号
     * @param str 字符串
     * @param maxLength 最大长度
     * @return 截取后的字符串
     */
    public static String abbreviate(String str, int maxLength) {
        if (isBlank(str) || str.length() <= maxLength) {
            return str;
        }
        return str.substring(0, maxLength) + "...";
    }
    
    /**
     * 生成随机字符串
     * @param length 长度
     * @return 随机字符串
     */
    public static String randomString(int length) {
        return cn.hutool.core.util.RandomUtil.randomString(length);
    }
    
    /**
     * 生成随机数字字符串
     * @param length 长度
     * @return 随机数字字符串
     */
    public static String randomNumbers(int length) {
        return cn.hutool.core.util.RandomUtil.randomNumbers(length);
    }
}